package dt.inlee.common.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;

import org.apache.log4j.Logger;

/**
 * JDBC工具类
 * 
 */
public class DBToolkit {
	private static Logger logger = Logger.getLogger(DBToolkit.class);

	/**
	 * @用途：创建一个数据库连接
	 * @param jdbcDriver
	 * @param url
	 * @param username
	 * @param password
	 * @return
	 * @throws ClassNotFoundException 
	 * @throws ClassNotFoundException
	 * @throws ClassNotFoundException
	 * @throws SQLException 
	 */
	public static Connection getConnection(String jdbcDriver, String url,
			String username, String password) throws ClassNotFoundException, SQLException {
		
		Connection conn = null;
		
		if(BaseUtil.isEmpty(jdbcDriver)){
			return conn;
		}
		// 创建数据库连接
		//try {
			Class.forName(jdbcDriver);
			//设置连接超时时间
			DriverManager.setLoginTimeout(5);
			conn = DriverManager.getConnection(url, username, password);
//		} catch (SQLException e) {
//			logger.error("#ERROR# :创建数据库连接发生异常，请检查！", e);
//		} catch (ClassNotFoundException e) {
//			logger.error("#ERROR# :创建数据库加载驱动异常，请检查！", e);
//		}
		return conn;
	}

	/**
	 * 在一个数据库连接上执行一个静态SQL语句查询
	 * 
	 * @param conn
	 *            数据库连接
	 * @param staticSql
	 *            静态SQL语句字符串
	 * @return 返回查询结果集ResultSet对象
	 */
	public static ResultSet executeQuery(Connection conn, String staticSql) {
		ResultSet rs = null;
		try {
			// 创建执行SQL的对象
			Statement stmt = conn.createStatement();
			// 执行SQL，并获取返回结果
			rs = stmt.executeQuery(staticSql);
		} catch (SQLException e) {
			logger.error("#ERROR# :执行SQL语句出错，请检查！\n" + staticSql, e);
		}
		return rs;
	}

	/**
	 * 在一个数据库连接上执行一个静态SQL语句
	 * 
	 * @param conn
	 *            数据库连接
	 * @param staticSql
	 *            静态SQL语句字符串
	 */
	public static void executeSQL(Connection conn, String staticSql) {
		try {
			// 创建执行SQL的对象
			Statement stmt = conn.createStatement();
			// 执行SQL，并获取返回结果
			stmt.execute(staticSql);
		} catch (SQLException e) {
			logger.error("#ERROR# :执行SQL语句出错，请检查！\n" + staticSql, e);
		}
	}

	/**
	 * 在一个数据库连接上执行一批静态SQL语句
	 * 
	 * @param conn
	 *            数据库连接
	 * @param sqlList
	 *            静态SQL语句字符串集合
	 */
	public static void executeBatchSQL(Connection conn, List<String> sqlList) {
		try {
			// 创建执行SQL的对象
			Statement stmt = conn.createStatement();
			for (String sql : sqlList) {
				stmt.addBatch(sql);
			}
			// 执行SQL，并获取返回结果
			stmt.executeBatch();
		} catch (SQLException e) {
			logger.error("#ERROR# :执行批量SQL语句出错，请检查！", e);
		}
	}

	/**
	 * 关闭数据库连接
	 * 
	 * @param conn
	 */
	public static void closeConnection(Connection conn) {
		if (conn == null)
			return;
		try {
			if (!conn.isClosed()) {
				// 关闭数据库连接
				conn.close();
			}
		} catch (SQLException e) {
			logger.error("#ERROR# :关闭数据库连接发生异常，请检查！", e);
		}
	}
}
